home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / opengl / glpixmap / glbox.cpp.z / glbox.cpp
C/C++ Source or Header  |  2002-04-08  |  6KB  |  260 lines

  1. /****************************************************************************
  2. ** $Id:  qt/glbox.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. /****************************************************************************
  12. **
  13. ** This is a simple QGLWidget displaying a box
  14. **
  15. ** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
  16. ** in the Mesa distribution
  17. **
  18. ****************************************************************************/
  19.  
  20. #include <math.h>
  21.  
  22. #include "glbox.h"
  23.  
  24. #if defined(Q_CC_MSVC)
  25. #pragma warning(disable:4305) // init: truncation from const double to float
  26. #endif
  27.  
  28. /*!
  29.   Create a GLBox widget
  30. */
  31.  
  32. GLBox::GLBox( QWidget* parent, const char* name, const QGLWidget* shareWidget )
  33.     : QGLWidget( parent, name, shareWidget )
  34. {
  35.     xRot = yRot = zRot = 0.0;        // default object rotation
  36.     scale = 1.5;            // default object scale
  37. }
  38.  
  39.  
  40. /*!
  41.   Create a GLBox widget
  42. */
  43.  
  44. GLBox::GLBox( const QGLFormat& format, QWidget* parent, const char* name, 
  45.           const QGLWidget* shareWidget )
  46.     : QGLWidget( format, parent, name, shareWidget )
  47. {
  48.     xRot = yRot = zRot = 0.0;        // default object rotation
  49.     scale = 1.5;            // default object scale
  50. }
  51.  
  52.  
  53. /*!
  54.   Release allocated resources
  55. */
  56.  
  57. GLBox::~GLBox()
  58. {
  59.     makeCurrent();
  60.     glDeleteLists( object, 1 );
  61. }
  62.  
  63.  
  64. /*!
  65.   Set up the OpenGL rendering state, and define display list
  66. */
  67.  
  68. void GLBox::initializeGL()
  69. {
  70.     qglClearColor( green );        // Let OpenGL clear to green
  71.     object = makeObject();        // Make display list
  72.     glEnable( GL_DEPTH_TEST );
  73. }
  74.  
  75.  
  76. /*!
  77.   Set up the OpenGL view port, matrix mode, etc.
  78. */
  79.  
  80. void GLBox::resizeGL( int w, int h )
  81. {
  82.     glViewport( 0, 0, (GLint)w, (GLint)h );
  83.     glMatrixMode( GL_PROJECTION );
  84.     glLoadIdentity();
  85.     glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 200.0);
  86. }
  87.  
  88.  
  89. /*!
  90.   Paint the box. The actual openGL commands for drawing the box are
  91.   performed here.
  92. */
  93.  
  94. void GLBox::paintGL()
  95. {
  96.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  97.  
  98.     glMatrixMode( GL_MODELVIEW );
  99.     glLoadIdentity();
  100.     glTranslatef( 0.0, 0.0, -3.0 );
  101.     glScalef( scale, scale, scale );
  102.  
  103.     glRotatef( xRot, 1.0, 0.0, 0.0 ); 
  104.     glRotatef( yRot, 0.0, 1.0, 0.0 ); 
  105.     glRotatef( zRot, 0.0, 0.0, 1.0 );
  106.  
  107.     glCallList( object );
  108. }
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115. /*!
  116.   Generate an OpenGL display list for the object to be shown, i.e. the box
  117. */
  118.  
  119. GLuint GLBox::makeObject()
  120. {    
  121.     GLuint list;
  122.  
  123.     list = glGenLists( 1 );
  124.  
  125.     glNewList( list, GL_COMPILE );
  126.  
  127.     GLint i, j, rings, sides;
  128.     float theta1, phi1, theta2, phi2;
  129.     float v0[03], v1[3], v2[3], v3[3];
  130.     float t0[03], t1[3], t2[3], t3[3];
  131.     float n0[3], n1[3], n2[3], n3[3];
  132.     float innerRadius=0.4;
  133.     float outerRadius=0.8;
  134.     float scalFac;
  135.     double pi = 3.14159265358979323846;
  136.  
  137.     rings = 8;
  138.     sides = 10;
  139.     scalFac=1/(outerRadius*2);
  140.  
  141.     for (i = 0; i < rings; i++) {
  142.         theta1 = (float)i * 2.0 * pi / rings;
  143.         theta2 = (float)(i + 1) * 2.0 * pi / rings;
  144.         for (j = 0; j < sides; j++) {
  145.             phi1 = (float)j * 2.0 * pi / sides;
  146.             phi2 = (float)(j + 1) * 2.0 * pi / sides;
  147.  
  148.             v0[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi1));
  149.             v0[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi1));
  150.             v0[2] = innerRadius * sin(phi1);
  151.  
  152.             v1[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi1));
  153.             v1[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi1));
  154.             v1[2] = innerRadius * sin(phi1);
  155.             v2[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi2));
  156.             v2[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi2));
  157.             v2[2] = innerRadius * sin(phi2);
  158.  
  159.             v3[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi2));
  160.             v3[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi2));
  161.             v3[2] = innerRadius * sin(phi2);
  162.  
  163.             n0[0] = cos(theta1) * (cos(phi1));
  164.             n0[1] = -sin(theta1) * (cos(phi1));
  165.             n0[2] = sin(phi1);
  166.  
  167.             n1[0] = cos(theta2) * (cos(phi1));
  168.             n1[1] = -sin(theta2) * (cos(phi1));
  169.             n1[2] = sin(phi1);
  170.  
  171.             n2[0] = cos(theta2) * (cos(phi2));
  172.             n2[1] = -sin(theta2) * (cos(phi2));
  173.             n2[2] = sin(phi2);
  174.  
  175.             n3[0] = cos(theta1) * (cos(phi2));
  176.             n3[1] = -sin(theta1) * (cos(phi2));
  177.             n3[2] = sin(phi2);
  178.  
  179.             t0[0] = v0[0]*scalFac + 0.5;
  180.             t0[1] = v0[1]*scalFac + 0.5;
  181.             t0[2] = v0[2]*scalFac + 0.5;
  182.  
  183.             t1[0] = v1[0]*scalFac + 0.5;
  184.             t1[1] = v1[1]*scalFac + 0.5;
  185.             t1[2] = v1[2]*scalFac + 0.5;
  186.  
  187.             t2[0] = v2[0]*scalFac + 0.5;
  188.             t2[1] = v2[1]*scalFac + 0.5;
  189.             t2[2] = v2[2]*scalFac + 0.5;
  190.  
  191.             t3[0] = v3[0]*scalFac + 0.5;
  192.             t3[1] = v3[1]*scalFac + 0.5;
  193.             t3[2] = v3[2]*scalFac + 0.5;
  194.  
  195.         // Create blue-black checkered coloring
  196.         if ( (i+j) % 2 )
  197.         qglColor( black );
  198.         else
  199.         qglColor( QColor( "steelblue" ) );
  200.  
  201.             glBegin(GL_POLYGON);
  202.                 glNormal3fv(n3); glTexCoord3fv(t3); glVertex3fv(v3);
  203.                 glNormal3fv(n2); glTexCoord3fv(t2); glVertex3fv(v2);
  204.                 glNormal3fv(n1); glTexCoord3fv(t1); glVertex3fv(v1);
  205.                 glNormal3fv(n0); glTexCoord3fv(t0); glVertex3fv(v0);
  206.             glEnd();
  207.         }
  208.     }
  209.     glEndList();
  210.  
  211.     return list;
  212. }
  213.  
  214.  
  215. /*!
  216.   Set the rotation angle of the object to \e degrees around the X axis.
  217. */
  218.  
  219. void GLBox::setXRotation( int degrees )
  220. {
  221.     xRot = (GLfloat)(degrees % 360);
  222.     updateGL();
  223. }
  224.  
  225.  
  226. /*!
  227.   Set the rotation angle of the object to \e degrees around the Y axis.
  228. */
  229.  
  230. void GLBox::setYRotation( int degrees )
  231. {
  232.     yRot = (GLfloat)(degrees % 360);
  233.     updateGL();
  234. }
  235.  
  236.  
  237. /*!
  238.   Set the rotation angle of the object to \e degrees around the Z axis.
  239. */
  240.  
  241. void GLBox::setZRotation( int degrees )
  242. {
  243.     zRot = (GLfloat)(degrees % 360);
  244.     updateGL();
  245. }
  246.  
  247.  
  248.  
  249.  
  250. /*!
  251.   Sets the rotation angles of this object to that of \a fromBox
  252. */
  253.  
  254. void GLBox::copyRotation( const GLBox& fromBox )
  255. {
  256.     xRot = fromBox.xRot;
  257.     yRot = fromBox.yRot;
  258.     zRot = fromBox.zRot;
  259. }
  260.